package com.huaxin.hxmoduleworkorder.common.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxmoduleworkorder.common.enums.base.BaseCodeEnum;

import java.util.Set;

/* -------------------------------------------------------------------------------------------------------------------*/
/*所有电工任务状态（MaintenanceOrderElectricianTaskStatus）
 * 状态码 (code)	   中文描述	说明	                         状态类型
 * assigned	       已分配	管理员已分配任务，电工待接单	     初始状态
 * accepted	       已接单	电工确认接受任务	             中间状态
 * rejected	       已拒单	电工拒绝执行任务	             终态
 * on_site	           已到场	电工到达客户现场	             中间状态
 * processing	       处理中	正在进行维修操作	             中间状态
 * resolved	       已解决	维修完成并提交结果	             终态
 * cancelled	       已取消	任务被管理员或系统取消	         终态
/* -------------------------------------------------------------------------------------------------------------------*/
/* -------------------------------------------------------------------------------------------------------------------*/
/* 状态分类（按生命周期）
 * 类型	            状态
 * 初始状态	        assigned
 * 中间状态	        accepted, on_site, processing
 * 终态（Terminal）	rejected, resolved, cancelled
 * 一旦进入终态，任务不可再修改或操作。
/* -------------------------------------------------------------------------------------------------------------------*/
/* 状态流转规则说明
 * 当前状态 → 下一状态	触发操作	允许角色
 * ASSIGNED → ACCEPTED	ACCEPT	电工
 * ASSIGNED → REJECTED	REJECT	电工
 * ACCEPTED → ON_SITE	ON_SITE	电工
 * ACCEPTED → REJECTED	REJECT	电工
 * ON_SITE → PROCESSING	START_PROCESS	电工
 * ON_SITE → REJECTED	REJECT	电工
 * PROCESSING → RESOLVED	RESOLVE	电工
 * PROCESSING → REJECTED	REJECT	电工
 * 注意：
 * 一旦进入 rejected、resolved、cancelled，任务结束。
 * 所有非终态均可被管理员或系统标记为 CANCELLED。
 * 仅分配给当前电工的任务，该电工才可执行操作。
 * 终态任务仅允许 VIEW 操作。
/*--------------------------------------------------------------------------------------------------------------------*/
/*状态排序与进度
 *状态	排序值	进度参考
 *ASSIGNED	10	0%
 *ACCEPTED	20	17%
 *REJECTED	30	终态
 *ON_SITE	40	50%
 *PROCESSING	50	67%
 *RESOLVED	60	终态
 *CANCELLED	70	终态
 *进度计算公式：(当前 sort - 10) / (60) * 100（最大有效流程为 60）
/*--------------------------------------------------------------------------------------------------------------------*/

/**
 * 电工任务处理状态枚举
 * 描述电工在工单中的当前处理阶段
 */
public enum MaintenanceOrderElectricianTaskStatus implements BaseCodeEnum {
    UNKNOWN("unknown", "未知", 0),
    ASSIGNED("assigned", "已分配", 10),      // 管理员分配了任务
    ACCEPTED("accepted", "已接单", 20),      // 电工确认接单
    REJECTED("rejected", "已拒单", 30),      // 电工拒单
    ON_SITE("on_site", "已到场", 40),        // 到达现场
    PROCESSING("processing", "处理中", 50),   // 开始维修
    RESOLVED("resolved", "已解决", 60),      // 提交结果
    CANCELLED("cancelled", "已取消", 70);    // 任务被取消

    @EnumValue
    private final String code;
    private final String displayName;
    private final int sort; // 用于表示状态顺序

    MaintenanceOrderElectricianTaskStatus(String code, String displayName, int sort) {
        this.code = code;
        this.displayName = displayName;
        this.sort = sort;
    }

    /**
     * JSON序列化时输出code
     */
    @JsonValue
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    public int getSort() {
        return sort;
    }

    /**
     * 根据 code 获取枚举值
     */
    public static MaintenanceOrderElectricianTaskStatus of(String code) {
        if (code == null) return null;
        for (MaintenanceOrderElectricianTaskStatus status : values()) {
            if (status.getCode().equalsIgnoreCase(code)) {
                return status;
            }
        }
        return null;
    }

    /**
     * 判断是否为有效状态
     */
    public static boolean isValid(String code) {
        return of(code) != null;
    }

    public boolean isTerminal() {
        return Set.of(RESOLVED, REJECTED, CANCELLED).contains(this);
    }

    // 提供静态方法获取所有未完成状态的值
    public static String[] getIncompleteCodes() {
        return new String[]{
                ASSIGNED.getCode(),
                ACCEPTED.getCode(),
                ON_SITE.getCode(),
                PROCESSING.getCode()
        };
    }
}
